import threading

import pystray
from PIL import Image
from tkinterdnd2 import TkinterDnD

from utils.ip_switcher_util import IpSwitcher
from notify.notification import NotificationSystem
from utils.file_util import FileUtil
from utils.log_util import get_logger
from utils.task_db_util import TaskDatabase
from views.image_processor_view import ImageProcessorView
from views.main_view import MainView
from views.network_config_view import NetworkConfigView
from views.report_view import ReportView
from views.task_view import TaskManagerView


class SystemTrayApp:
    """系统托盘应用主类"""

    def __init__(self):

        # 初始化核心组件
        self.root = TkinterDnD.Tk()
        self.root.title("市场股提升效率工具")
        self.icon_path = FileUtil.resource_path("app_icon.ico")
        # 同时设置窗口图标和任务栏图标
        self.root.iconbitmap(self.icon_path)
        self.root.geometry("500x400")
        self.root.protocol("WM_DELETE_WINDOW", self.minimize_to_tray)
        self.tray_icon = None

        # 初始化服务层
        self.ip_switcher = IpSwitcher()
        # 任务数据库
        self.task_db = TaskDatabase()
        # 设置托盘图标
        self.setup_tray_icon()
        self.notification_system = NotificationSystem(
            self.root, self.task_db, self.tray_icon
        )  # 通知系统

        # 初始化视图
        self.main_view = MainView(self.root, self)
        self.logger = get_logger()

    def setup_tray_icon(self):
        """创建系统托盘图标"""

        # 加载图标文件
        try:
            icon_image = Image.open(self.icon_path)
        except Exception as e:
            self.logger.info(f"无法加载图标文件: {e}")
            icon_image = None

        self.tray_icon = pystray.Icon(
            "network_tool",
            icon=icon_image,
            title="OT-SLAYER",
            menu=pystray.Menu(
                pystray.MenuItem("显示主窗口", self.show_main_window),
                pystray.MenuItem("退出", self.quit_app),
            ),
        )

        # 在单独的线程中运行托盘图标
        threading.Thread(target=self.tray_icon.run, daemon=True).start()

    def show_main_window(self, icon=None, item=None):
        """显示主窗口"""
        self.root.deiconify()
        self.root.after(0, self.root.lift)

    def minimize_to_tray(self):
        """最小化到系统托盘"""
        self.root.withdraw()

    def quit_app(self, icon=None, item=None):
        """退出应用程序"""
        self.tray_icon.stop()
        self.root.destroy()
        import sys

        sys.exit()

    def switch_network(self, network_type):
        """切换网络配置"""
        try:
            if network_type == "internal":
                success = self.ip_switcher.switch_to(network_type="internal")
                message = (
                    "已切换到内网配置" if success else "切换到内网失败，请检查网络配置"
                )
            else:
                success = self.ip_switcher.switch_to(network_type="external")
                message = (
                    "已切换到外网配置" if success else "切换到外网失败，请检查网络配置"
                )

            self.main_view.update_status(message, success)
        except Exception as e:
            self.main_view.update_status(f"错误: {str(e)}", False)

    def show_reminder_dialog(self, container=None):
        """显示提醒任务对话框 - 支持内嵌"""
        if container:
            # 内嵌版本 - 直接显示在容器中
            TaskManagerView(
                parent=None,
                db=self.task_db,
                notification_system=self.notification_system,
                container=container,
            )
        else:
            # 原版 - 弹出对话框
            TaskManagerView(self.root, self.task_db, self.notification_system)

    def show_report_view(self, container=None):
        """显示报表分析界面 - 支持内嵌"""
        if container:
            # 内嵌版本 - 直接显示在容器中
            ReportView(parent=None, container=container, db=self.task_db)
        else:
            # 原版 - 弹出对话框
            ReportView(self.root, self.task_db)

    def show_network_config(self, config_manager, container=None):
        """显示网络设置 - 支持内嵌"""
        if container:
            # 内嵌版本 - 直接显示在容器中
            NetworkConfigView(parent=None, container=container)
        else:
            # 原版 - 弹出对话框
            NetworkConfigView(self.root)

    def show_collect_picture(self, config_manager, container=None):
        """显示网络设置 - 支持内嵌"""
        if container:
            # 内嵌版本 - 直接显示在容器中
            ImageProcessorView(
                parent=self.root, container=container, config_manager=config_manager
            )
        else:
            # 原版 - 弹出对话框
            ImageProcessorView(self.root, config_manager)

    def run(self):
        """运行主程序"""
        self.root.mainloop()
